import { Shape, Point } from "./types";
import { getRandom } from "./util";
import { SquareGroup } from "./SquareGroup";

export class TShape extends SquareGroup {
  constructor(_centerPoint: Point, _color: string) {
    const shape: Shape = [
      { x: 0, y: -1 },
      { x: -1, y: 0 },
      { x: 0, y: 0 },
      { x: 1, y: 0 }
    ];
    super(shape, _centerPoint, _color);
  }
}

export class JShape extends SquareGroup {
  constructor(_centerPoint: Point, _color: string) {
    const shape: Shape = [
      { x: 0, y: -2 },
      { x: 0, y: -1 },
      { x: 0, y: 0 },
      { x: -1, y: 0 }
    ];
    super(shape, _centerPoint, _color);
  }
}

export class LShape extends SquareGroup {
  constructor(_centerPoint: Point, _color: string) {
    const shape: Shape = [
      { x: 0, y: -2 },
      { x: 0, y: -1 },
      { x: 0, y: 0 },
      { x: 1, y: 0 }
    ];
    super(shape, _centerPoint, _color);
  }
}

export class SShape extends SquareGroup {
  constructor(_centerPoint: Point, _color: string) {
    const shape: Shape = [
      { x: 0, y: -1 },
      { x: 1, y: -1 },
      { x: -1, y: 0 },
      { x: 0, y: 0 }
    ];
    super(shape, _centerPoint, _color);
  }
  rotate() {
    // super.xxx -- 调用父级的方法
    super.rotate();
    this.isClock = !this.isClock;
  }
}
export class ZShape extends SquareGroup {
  constructor(_centerPoint: Point, _color: string) {
    const shape: Shape = [
      { x: -1, y: -1 },
      { x: 0, y: -1 },
      { x: 0, y: 0 },
      { x: 1, y: 0 }
    ];
    super(shape, _centerPoint, _color);
  }
  rotate() {
    // super.xxx -- 调用父级的方法
    super.rotate();
    this.isClock = !this.isClock;
  }
}

export class LineShape extends SquareGroup {
  constructor(_centerPoint: Point, _color: string) {
    const shape: Shape = [
      { x: -2, y: 0 },
      { x: -1, y: 0 },
      { x: 0, y: 0 },
      { x: 1, y: 0 }
    ];
    super(shape, _centerPoint, _color);
  }
  rotate() {
    // super.xxx -- 调用父级的方法
    super.rotate();
    this.isClock = !this.isClock;
  }
}

export class squareShape extends SquareGroup {
  constructor(_centerPoint: Point, _color: string) {
    const shape: Shape = [
      { x: -1, y: -1 },
      { x: 0, y: -1 },
      { x: -1, y: 0 },
      { x: 0, y: 0 }
    ];
    super(shape, _centerPoint, _color);
  }
  rotate() {
    return;
  }
}

export const shapes = [
  TShape,
  JShape,
  LShape,
  SShape,
  ZShape,
  LineShape,
  squareShape
];

export const colors: ReadonlyArray<string> = [
  "#000000",
  "#000033",
  "#000066",
  "#000099",
  "#0000CC",
  "#0000FF",
  "#003300",
  "#003333",
  "#003366",
  "#003399",
  "#0033CC",
  "#0033FF",
  "#006600",
  "#006633",
  "#006666",
  "#006699",
  "#0066CC",
  "#0066FF",
  "#009900",
  "#009933",
  "#009966",
  "#009999",
  "#0099CC",
  "#0099FF",
  "#00CC00",
  "#00CC33",
  "#00CC66",
  "#00CC99",
  "#00CCCC",
  "#00CCFF",
  "#00FF00",
  "#00FF33",
  "#00FF66",
  "#00FF99",
  "#00FFCC",
  "#330000",
  "#330033",
  "#330066",
  "#330099",
  "#3300CC",
  "#3300FF",
  "#333300",
  "#333333",
  "#333366",
  "#333399",
  "#3333CC",
  "#3333FF",
  "#336600",
  "#336633",
  "#336666",
  "#336699",
  "#3366CC",
  "#3366FF",
  "#339900",
  "#339933",
  "#339966",
  "#339999",
  "#3399CC",
  "#3399FF",
  "#33CC00",
  "#33CC33",
  "#33CC66",
  "#33CC99",
  "#33CCCC",
  "#33CCFF",
  "#33FF00",
  "#33FF33",
  "#33FF66",
  "#33FF99",
  "#33FFCC",
  "#33FFFF",
  "#660000",
  "#660033",
  "#660066",
  "#660099",
  "#6600CC",
  "#6600FF",
  "#663300",
  "#663333",
  "#663366",
  "#663399",
  "#6633CC",
  "#6633FF",
  "#666600",
  "#666633",
  "#666666",
  "#666699",
  "#6666CC",
  "#6666FF",
  "#669900",
  "#669933",
  "#669966",
  "#669999",
  "#6699CC",
  "#6699FF",
  "#66CC00",
  "#66CC33",
  "#66CC66",
  "#66CC99",
  "#66CCCC",
  "#66CCFF",
  "#66FF00",
  "#66FF33",
  "#66FF66",
  "#66FF99",
  "#66FFCC",
  "#990000",
  "#990033",
  "#990066",
  "#990099",
  "#9900CC",
  "#9900FF",
  "#993300",
  "#993333",
  "#993366",
  "#993399",
  "#9933CC",
  "#9933FF",
  "#996600",
  "#996633",
  "#996666",
  "#996699",
  "#9966CC",
  "#9966FF",
  "#999900",
  "#999933",
  "#999966",
  "#999999",
  "#9999CC",
  "#9999FF",
  "#99CC00",
  "#99CC33",
  "#99CC66",
  "#99CC99",
  "#99CCCC",
  "#99CCFF",
  "#99FF00",
  "#99FF33",
  "#99FF66",
  "#99FF99",
  "#99FFCC",
  "#99FFFF",
  "#CC0000",
  "#CC0033",
  "#CC0066",
  "#CC0099",
  "#CC00CC",
  "#CC00FF",
  "#CC3300",
  "#CC3333",
  "#CC3366",
  "#CC3399",
  "#CC33CC",
  "#CC33FF",
  "#CC6600",
  "#CC6633",
  "#CC6666",
  "#CC6699",
  "#CC66CC",
  "#CC66FF",
  "#CC9900",
  "#CC9933",
  "#CC9966",
  "#CC9999",
  "#CC99CC",
  "#CC99FF",
  "#CCCC00",
  "#CCCC33",
  "#CCCC66",
  "#CCCC99",
  "#CCCCCC",
  "#CCCCFF",
  "#CCFF00",
  "#CCFF33",
  "#CCFF66",
  "#CCFF99",
  "#CCFFCC",
  "#CCFFFF",
  "#FF0000",
  "#FF0033",
  "#FF0066",
  "#FF0099",
  "#FF00CC",
  "#FF00FF",
  "#FF3300",
  "#FF3333",
  "#FF3366",
  "#FF3399",
  "#FF33CC",
  "#FF33FF",
  "#FF6600",
  "#FF6633",
  "#FF6666",
  "#FF6699",
  "#FF66CC",
  "#FF66FF",
  "#FF9900",
  "#FF9933",
  "#FF9966",
  "#FF9999",
  "#FF99CC",
  "#FF99FF",
  "#FFCC00",
  "#FFCC33",
  "#FFCC66",
  "#FFCC99",
  "#FFCCCC",
  "#FFCCFF",
  "#FFFF00",
  "#FFFF33",
  "#FFFF66",
  "#FFFF99",
  "#FFFFCC",
  "#000000",
  "#000033",
  "#000066",
  "#000099",
  "#0000CC",
  "#0000FF",
  "#003300",
  "#003333",
  "#003366",
  "#003399",
  "#0033CC",
  "#0033FF",
  "#006600",
  "#006633",
  "#006666",
  "#006699",
  "#0066CC",
  "#0066FF",
  "#009900",
  "#009933",
  "#009966",
  "#009999",
  "#0099CC",
  "#0099FF",
  "#00CC00",
  "#00CC33",
  "#00CC66",
  "#00CC99",
  "#00CCCC",
  "#00CCFF",
  "#00FF00",
  "#00FF33",
  "#00FF66",
  "#00FF99",
  "#00FFCC",
  "#000000",
  "#000033",
  "#000066",
  "#000099",
  "#0000CC",
  "#0000FF",
  "#330000",
  "#330033",
  "#330066",
  "#330099",
  "#3300CC",
  "#3300FF",
  "#660000",
  "#660033",
  "#660066",
  "#660099",
  "#6600CC",
  "#6600FF",
  "#990000",
  "#990033",
  "#990066",
  "#990099",
  "#9900CC",
  "#9900FF",
  "#CC0000",
  "#CC0033",
  "#CC0066",
  "#CC0099",
  "#CC00CC",
  "#CC00FF",
  "#FF0000",
  "#FF0033",
  "#FF0066",
  "#FF0099",
  "#FF00CC",
  "#FF00FF",
  "#000000",
  "#003300",
  "#006600",
  "#009900",
  "#00CC00",
  "#00FF00",
  "#330000",
  "#333300",
  "#336600",
  "#339900",
  "#33CC00",
  "#33FF00",
  "#660000",
  "#663300",
  "#666600",
  "#669900",
  "#66CC00",
  "#66FF00",
  "#990000",
  "#993300",
  "#996600",
  "#999900",
  "#99CC00",
  "#99FF00",
  "#CC0000",
  "#CC3300",
  "#CC6600",
  "#CC9900",
  "#CCCC00",
  "#CCFF00",
  "#FF0000",
  "#FF3300",
  "#FF6600",
  "#FF9900",
  "#FFCC00",
  "#FFFF00",
  "#000000",
  "#111111",
  "#222222",
  "#333333",
  "#444444",
  "#555555",
  "#666666",
  "#777777",
  "#888888",
  "#999999",
  "#AAAAAA",
  "#BBBBBB",
  "#CCCCCC",
  "#333333",
  "#333366",
  "#333399",
  "#3333CC",
  "#336633",
  "#336666",
  "#336699",
  "#3366CC",
  "#339933",
  "#339966",
  "#339999",
  "#3399CC",
  "#33CC33",
  "#33CC66",
  "#33CC99",
  "#33CCCC",
  "#663333",
  "#663366",
  "#663399",
  "#6633CC",
  "#666633",
  "#666666",
  "#666699",
  "#6666CC",
  "#669933",
  "#669966",
  "#669999",
  "#6699CC",
  "#66CC33",
  "#66CC66",
  "#66CC99",
  "#66CCCC",
  "#993333",
  "#993366",
  "#993399",
  "#9933CC",
  "#996633",
  "#996666",
  "#996699",
  "#9966CC",
  "#999933",
  "#999966",
  "#999999",
  "#9999CC",
  "#99CC33",
  "#99CC66",
  "#99CC99",
  "#99CCCC",
  "#CC3333",
  "#CC3366",
  "#CC3399",
  "#CC33CC",
  "#CC6633",
  "#CC6666",
  "#CC6699",
  "#CC66CC",
  "#CC9933",
  "#CC9966",
  "#CC9999",
  "#CC99CC",
  "#CCCC33",
  "#CCCC66",
  "#CCCC99",
  "#CCCCCC",
  "#666666",
  "#666699",
  "#6666CC",
  "#6666FF",
  "#669966",
  "#669999",
  "#6699CC",
  "#6699FF",
  "#66CC66",
  "#66CC99",
  "#66CCCC",
  "#66CCFF",
  "#66FF66",
  "#66FF99",
  "#66FFCC",
  "#996666",
  "#996699",
  "#9966CC",
  "#9966FF",
  "#999966",
  "#999999",
  "#9999CC",
  "#9999FF",
  "#99CC66",
  "#99CC99",
  "#99CCCC",
  "#99CCFF",
  "#99FF66",
  "#99FF99",
  "#99FFCC",
  "#99FFFF",
  "#CC6666",
  "#CC6699",
  "#CC66CC",
  "#CC66FF",
  "#CC9966",
  "#CC9999",
  "#CC99CC",
  "#CC99FF",
  "#CCCC66",
  "#CCCC99",
  "#CCCCCC",
  "#CCCCFF",
  "#CCFF66",
  "#CCFF99",
  "#CCFFCC",
  "#CCFFFF",
  "#FF6666",
  "#FF6699",
  "#FF66CC",
  "#FF66FF",
  "#FF9966",
  "#FF9999",
  "#FF99CC",
  "#FF99FF",
  "#FFCC66",
  "#FFCC99",
  "#FFCCCC",
  "#FFCCFF",
  "#FFFF66",
  "#FFFF99",
  "#FFFFCC"
];

/**
 * 根据中心坐标点，生成随机的俄罗斯方块
 * @param {Point} centerPoint 需要生成的中心坐标点
 * @param {string} [color] 可选值，默认随机安全色
 * @returns {SquareGroup} 返回创建好的随机俄罗斯方块对象
 */
export function createTeris(centerPoint: Point, color?: string): SquareGroup {
  let index = getRandom(0, shapes.length);
  const shape = shapes[index];
  if (!color) {
    let index = getRandom(0, colors.length);
    color = colors[index];
  }
  return new shape(centerPoint, color);
}
